package jwt

import (
	"app/config"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

func New() Jwt {
	return Jwt{Secret: config.Config.Biz.JWT.Secret, Expire: config.Config.Biz.JWT.Expire}
}

type Jwt struct {
	Secret string
	Expire time.Duration
}

type TokenClaim struct {
	Id int `json:"id"`
	jwt.RegisteredClaims
}

// TokenGeneration 根据给定内容生成token
func (j Jwt) TokenGeneration(uid int) (string, error) {
	claim := TokenClaim{
		uid,
		jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(j.Expire)), // 定义过期时间
			Issuer:    config.Config.App.Name,                       // 签发人
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)
	//使用secret加密并返回加密串
	return token.SignedString([]byte(j.Secret))
}

// TokenParse 从给定的字符串中解析出Claims
func (j Jwt) TokenParse(token string) (*TokenClaim, error) {
	//解析token
	t, err := jwt.ParseWithClaims(token, &TokenClaim{}, func(t *jwt.Token) (interface{}, error) {
		return []byte(j.Secret), nil
	})
	if claim, ok := t.Claims.(*TokenClaim); ok && t.Valid {
		return claim, nil
	}
	return nil, err
}
